Portifólio R

Realizado por Letticia Nicoli

Esse markdown descreve, de forma breve, o que aprendi durante as aulas de “Programando IA com R” como ferramenta estatística e de modelagem de inteligência artificial.

Criação de sequências e atribuição em variáveis

Apenas para testes simples, não use isso em produção! Coloque em uma variável :)

1:5
## [1] 1 2 3 4 5
50:20
##  [1] 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28
## [24] 27 26 25 24 23 22 21 20
6:-3
##  [1]  6  5  4  3  2  1  0 -1 -2 -3
4:4
## [1] 4
1:0
## [1] 1 0
pi:6
## [1] 3.141593 4.141593 5.141593

Atribuindo um valor as varíaveis!

a <- "1" -> b
c <- "2" -> d
e <- "3" -> f
g <- "4" -> h
i <- "5"

Obs.: Tá tudo bem, podemos utilizar = ao invés de <-

Valores Especiais

Os valores especiais são NA, NaN, Inf e -Inf, Null

Exemplos:

var_na = NA
var_nan = 0/0
var_inf = 9/0
var_inf_neg = -1/0
var_null = NULL

NA vs NULL

c(18,NA,NA,19,50)
## [1] 18 NA NA 19 50
c(18,NA,NULL,19,50)
## [1] 18 NA 19 50

Existem funções para validarmos se a variável é um valor especial:

is.na(var_na)
## [1] TRUE
is.nan(var_nan)
## [1] TRUE
is.infinite(var_inf)
## [1] TRUE
is.infinite(var_inf_neg)
## [1] TRUE
is.finite(var_inf)
## [1] FALSE
is.null(var_null)
## [1] TRUE

Help

E antes de irmos mais a fundo…
Se for precisar de ajudar utilize o comando ? seguido do nome da função, operador, pacotes e etc que você tem dúvida.
Conforme exemplo abaixo:

?`:`
?'is.infinite'

Criação de diferentes tipos de vetores

Vetor Inteiro

vetor_inteiro <- 11:13
vetor_inteiro
## [1] 11 12 13

Vetor Numérico

vetor_numerico <- c(1.1,1.2,1.3)
vetor_numerico
## [1] 1.1 1.2 1.3

Vetor Texto

vetor_texto <- letters[11:13]
vetor_texto
## [1] "k" "l" "m"

Vetor Imaginário

vetor_imaginario <- c((1+1i), (1+2i),(1+1i))
vetor_imaginario
## [1] 1+1i 1+2i 1+1i

Vetor Lógico

vetor_logico <- c(TRUE,FALSE,TRUE)
vetor_logico
## [1]  TRUE FALSE  TRUE

Criação de listas

list(vetor_inteiro,vetor_numerico,vetor_texto,vetor_imaginario,vetor_logico)
## [[1]]
## [1] 11 12 13
## 
## [[2]]
## [1] 1.1 1.2 1.3
## 
## [[3]]
## [1] "k" "l" "m"
## 
## [[4]]
## [1] 1+1i 1+2i 1+1i
## 
## [[5]]
## [1]  TRUE FALSE  TRUE

Criação de sequências

No começo do markdown vimos que fazendo {valor}:{valor} conseguimos ter uma sequência de valores porém se você quer algo mais elaborado podemos utilizar a função seq para realizar ações como intervalo entre valores, quantidade total de valores dentro daquela sequência e etc.

seq(0, 1, length.out = 11)
##  [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
seq(1, 9, by = 2)
## [1] 1 3 5 7 9
seq(1, 6, by = 3)
## [1] 1 4
seq_len(17)
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17

Criação de matrizes

numerospares <- matrix(seq(from = 2,by = 2,length.out = 16), nrow =4)
numerospares
##      [,1] [,2] [,3] [,4]
## [1,]    2   10   18   26
## [2,]    4   12   20   28
## [3,]    6   14   22   30
## [4,]    8   16   24   32

Conseguimos ir muito além com matrizes, como por exemplo realizar multiplicação entre elas :O

Definindo algumas variáveis

vet_a = c(10,20,30,40,50)
vet_b = vet_a * 2
vet_c = sqrt(vet_b)

Criando nossas 2 matrizes:

m1 = matrix(data = c(vet_a,vet_b,vet_c), 
             ncol = 5, nrow = 6, byrow = TRUE)

m2 = matrix(data = c(vet_a,vet_b,vet_c), 
            ncol = 6, nrow = 5)

A mágica acontecendo:

 m1 %*% m2
##           [,1]      [,2]     [,3]      [,4]      [,5]     [,6]
## [1,]  5500.000 11000.000 1261.362  5500.000 11000.000 1261.362
## [2,] 11000.000 22000.000 2522.725 11000.000 22000.000 2522.725
## [3,]  1261.362  2522.725  300.000  1261.362  2522.725  300.000
## [4,]  5500.000 11000.000 1261.362  5500.000 11000.000 1261.362
## [5,] 11000.000 22000.000 2522.725 11000.000 22000.000 2522.725
## [6,]  1261.362  2522.725  300.000  1261.362  2522.725  300.000

Obs.: Sem % multiplica elemento por elemento, com % multiplica a matrix Se quisermos ir além, temos também matriz transposta t(), diagonal diag(), inversa solve()!

Criação de data frames

data.frame("Inteiros" = vetor_inteiro, 
                        "Numéricos" = vetor_numerico,
                        "Textos" = vetor_texto,
                        "Imaginários" = vetor_imaginario,
                        "Lógicos" = vetor_logico, 
                        row.names = c("L1","L2","L3"))
##    Inteiros Numéricos Textos Imaginários Lógicos
## L1       11       1.1      k        1+1i    TRUE
## L2       12       1.2      l        1+2i   FALSE
## L3       13       1.3      m        1+1i    TRUE

Replicando valores

rep(0, times = 20)
##  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
rep(c(0, 1, 2), times = 10)
##  [1] 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2
rep(c(0, 1, 2), each = 10)
##  [1] 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2

Filtros

Estou utilizando o dataset mtcars do próprio R para demonstrar como conseguimos filtrar informações.

mtcars
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

Uma das maneiras para selecionar uma informação em especiífico é utilizar {nomeDataSet}[{numeroLinha}:{numeroColuna}].

mtcars[2,5] #row,column
## [1] 3.9
mtcars[2:4,5]
## [1] 3.90 3.85 3.08
mtcars[2:4,5:7]
##                drat    wt  qsec
## Mazda RX4 Wag  3.90 2.875 17.02
## Datsun 710     3.85 2.320 18.61
## Hornet 4 Drive 3.08 3.215 19.44
mtcars[8:9, c(1,2,4)]
##            mpg cyl hp
## Merc 240D 24.4   4 62
## Merc 230  22.8   4 95
mtcars[2:4, c("mpg", "wt")]
##                 mpg    wt
## Mazda RX4 Wag  21.0 2.875
## Datsun 710     22.8 2.320
## Hornet 4 Drive 21.4 3.215

Obs.: Como podemos observar também é possível utilizar sequências e vetores para trazer mais informações.

Amostras e Simulações

Distribuição uniforme

runif(n=2, min = 1, max = 10)
## [1] 2.927022 8.419497

Avalia probabilidade

dunif(x= 8, min = 1, max = 10)
## [1] 0.1111111

Obs.: Número máximo nao é sorteado.

Avalia probabilidade acumulada

punif(q= 2, min = 1, max = 10)
## [1] 0.1111111

Amostra a partir de um domínio

Colocar marcador para que o sorteio sempre seja igual

set.seed(1) 
amostra = c( "T", "R", "I", "A", "N", "G", "U", "L", "O", "S")
sample(x = amostra, replace = FALSE)
##  [1] "O" "A" "U" "T" "R" "N" "I" "S" "G" "L"
sample(x = amostra, replace = TRUE)
##  [1] "I" "T" "N" "N" "S" "G" "S" "U" "O" "N"
sample(x = amostra, size = 5)
## [1] "N" "O" "T" "G" "S"
sample(x = amostra, size = 10, replace = TRUE,
       prob = c(1, 1, 5, 1, 1, 1, 1, 1, 1, 5))
##  [1] "O" "S" "S" "G" "S" "I" "A" "L" "A" "I"

Simulando um modelo linear

set.seed(20)
b0 = rep(0.5, times = 100)
b1 = rep(2, times = 100)
x = rnorm(n = 100, mean = 0, sd = 1)
e = rnorm(n = 100, mean = 0, sd = 2)

valor = b0 + (b1 * x) + e
library(plotly)
## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
plot_ly( x = x, y = valor, type = "scatter" )
## No scatter mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode

Obs.: A função plot_ly permite a criação de gráficos

Loop

acumuladora = 0;
vetor = NULL;

for (passenger in AirPassengers) {
  acumuladora = acumuladora + passenger;
  vetor = c(vetor, acumuladora);
}

Obs.: O dataset AirPassengers vem por padrão no R

Fatorial

func = function(num){
  
  init = 1;
  for (variable in seq_len(num)) {
    init = init * variable;
  }
  
  init
}

func(3)
## [1] 6

Análise Grática com Plots

Parábola Quadrática

x = -10:10
plot( x = x, y = x**2, main = "Parábola")

plot( x = x, y = x**2, main = "Parábola", type='l')

plot( x = x, y = x**2, main = "Parábola", type='p')

plot( x = x, y = x**2, main = "Parábola", type='b')

plot( x = x, y = x**2, main = "Parábola", type='o')

plot( x = x, y = x**2, main = "Parábola", type='h') 

plot( x = x, y = x**2, main = "Parábola", type='s')

plot( x = x, y = x**2, main = "Parábola", type='S')

Análise de Tendências

head(cars)
##   speed dist
## 1     4    2
## 2     4   10
## 3     7    4
## 4     7   22
## 5     8   16
## 6     9   10
summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00
plot(x= cars$speed, y = cars$dist)

Histograma Frequência e distribuição

sequency = -10:10
hist(sequency^2)

Boxplot

f = airquality$Ozone ~ airquality$Month
boxplot(f,data=airquality)

Multiplos Gráficos

par(mfrow=c(1,2))
plot(airquality$Wind, airquality$Ozone)
plot(airquality$Solar.R, airquality$Ozone)

Obs.: O dataset Airquality também vem por padrão no R

Pipe

O operador %>% (pipe) foi uma das grandes revoluções do R, tornando a leitura de códigos mais lógica, fácil e compreensível.
É necessário ter instalado o pacote magrittr

library(magrittr)

A ideia do operador %>% (pipe) é bem simples: usar o valor resultante da expressão do lado esquerdo como primeiro argumento da função do lado direito.
Vamos calcular a raiz quadrada da soma dos valores de 1 a 4. Primeiro, sem o pipe.

x <- c(1, 2, 3, 4)
sqrt(sum(x))
## [1] 3.162278

Agora com o pipe.

x %>% sum %>% sqrt
## [1] 3.162278

Clusters

Distribuição

set.seed(1909)
x = rnorm(15,mean = rep(1:3, each=5),sd = 0.2)
y = rnorm(15,mean = rep(c(1,2), each=5),sd = 0.2)
plot(x,y,col='blue',pch=19,cex=1)
text(x + 0.05, y + 0.05, labels=as.character(1:15))

Kmeans

mydata = data.frame(x,y)
modelo = kmeans(x = mydata, centers = 3)

modelo$centers 
##          x        y
## 1 1.042156 1.026402
## 2 2.004588 1.923189
## 3 3.157757 1.057685

Acima podemos observar os centroides dos clusters!

Curiosidade

Existe um dataset do Starwars <3
Você vai precisar instalar o pacote dplyr

library('dplyr')
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
head(starwars)
## # A tibble: 6 x 13
##   name  height  mass hair_color skin_color eye_color birth_year gender
##   <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> 
## 1 Luke…    172    77 blond      fair       blue            19   male  
## 2 C-3PO    167    75 <NA>       gold       yellow         112   <NA>  
## 3 R2-D2     96    32 <NA>       white, bl… red             33   <NA>  
## 4 Dart…    202   136 none       white      yellow          41.9 male  
## 5 Leia…    150    49 brown      light      brown           19   female
## 6 Owen…    178   120 brown, gr… light      blue            52   male  
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>
starwars %>% filter(species == "Droid")
## # A tibble: 5 x 13
##   name  height  mass hair_color skin_color eye_color birth_year gender
##   <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> 
## 1 C-3PO    167    75 <NA>       gold       yellow           112 <NA>  
## 2 R2-D2     96    32 <NA>       white, bl… red               33 <NA>  
## 3 R5-D4     97    32 <NA>       white, red red               NA <NA>  
## 4 IG-88    200   140 none       metal      red               15 none  
## 5 BB8       NA    NA none       none       black             NA none  
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## #   vehicles <list>, starships <list>

Hey!

| Todo esse conteúdo está disponível no meu GitHub, clique aqui :)